package aceim.app.screen.tablet;
import static aceim.app.utils.linq.KindaLinq.from;
import java.util.ArrayList;
import java.util.List;
import aceim.app.MainActivity;
import aceim.app.R;
import aceim.app.screen.Screen;
import aceim.app.utils.PageManager;
import aceim.app.utils.linq.KindaLinqRule;
import aceim.app.view.page.Page;
import aceim.app.view.page.contactlist.ContactList;
import aceim.app.view.page.other.Splash;
import aceim.app.widgets.bottombar.BottomBarButton;
import aceim.app.widgets.pageselector.PageAdapter;
import aceim.app.widgets.pageselector.TabSelector;
import android.annotation.SuppressLint;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewConfiguration;
public class TabletScreen extends Screen {
private final PageAdapter mPageAdapterLeft;
private final TabSelector mTabHolderLeft;
private final PageManager mPageManagerLeft;
private final PageAdapter mPageAdapterRight;
private final TabSelector mTabHolderRight;
private final PageManager mPageManagerRight;
private final BottomBarButton mMenuButton;
private final OnHierarchyChangeListener mTabChangedListener = new OnHierarchyChangeListener() {
@Override
public void onChildViewRemoved(View parent, View child) {
if (parent == mTabHolderLeft) {
findViewById(R.id.fragment_holder_left).setBackgroundResource(mPageAdapterLeft.getCount() > 0 ? 0 : R.drawable.cornered_background);
} else {
findViewById(R.id.fragment_holder_right).setBackgroundResource(mPageAdapterRight.getCount() > 0 ? 0 : R.drawable.cornered_background);
}
}
@Override
public void onChildViewAdded(View parent, View child) {
if (parent == mTabHolderLeft) {
mTabHolderLeft.setSelectedPage((Page) child.getTag());
findViewById(R.id.fragment_holder_left).setBackgroundResource(0);
} else {
mTabHolderRight.setSelectedPage((Page) child.getTag());
findViewById(R.id.fragment_holder_right).setBackgroundResource(0);
}
}
};
public TabletScreen(MainActivity activity) {
super(activity);
LayoutInflater.from(activity).inflate(R.layout.screen_tablet, this);
mMenuButton = (BottomBarButton) findViewById(R.id.menu_button);
mMenuButton.setOnClickListener(mMenuButtonClickListener);
mMenuButton.setOnLongClickListener(mMenuButtonLongClickListener);
mTabHolderLeft = (TabSelector) findViewById(R.id.tab_selector_left);
mPageManagerLeft = new PageManager(R.id.fragment_holder_left, activity);
mPageAdapterLeft = new PageAdapter(activity, mTabClickListener, activity.getThemesManager().getViewResources().getTabItemLayout(), mPageManagerLeft.getPages());
mPageAdapterLeft.setNotifyOnChange(true);
mTabHolderLeft.setPageAdapter(mPageAdapterLeft);
mTabHolderLeft.setOnHierarchyChangeListener(mTabChangedListener);
mTabHolderRight = (TabSelector) findViewById(R.id.tab_selector_right);
mPageManagerRight = new PageManager(R.id.fragment_holder_right, activity);
mPageAdapterRight = new PageAdapter(activity, mTabClickListener, activity.getThemesManager().getViewResources().getTabItemLayout(), mPageManagerRight.getPages());
mPageAdapterRight.setNotifyOnChange(true);
mTabHolderRight.setPageAdapter(mPageAdapterRight);
mTabHolderRight.setOnHierarchyChangeListener(mTabChangedListener);
}
@Override
public void addPage(Page page, boolean setAsCurrent) {
String pageId = page.getPageId();
if (findPage(pageId) == null) {
if (page instanceof ContactList) {
mPageAdapterLeft.add(page);
} else {
mPageAdapterRight.add(page);
}
}
if (setAsCurrent) {
setSelectedPage(pageId);
}
if (!(page instanceof Splash)) {
setMenuButtonAvailability();
}
}
@Override
public Page findPage(final String pageId) {
return from(getAllPages()).where(new KindaLinqRule<Page>() {
@Override
public boolean match(Page t) {
return t.getPageId().equals(pageId);
}
}).first();
}
@Override
public void onPageChanged(String pageId) {
if (pageId.startsWith(ContactList.class.getSimpleName())) {
mPageManagerLeft.onPageChanged(findPage(mPageManagerLeft.getPages(), pageId));
} else {
mPageManagerRight.onPageChanged(findPage(mPageManagerRight.getPages(), pageId));
}
}
@Override
public void setSelectedPage(String pageId) {
onPageChanged(pageId);
if (pageId.startsWith(ContactList.class.getSimpleName())) {
Page page = findPage(mPageManagerLeft.getPages(), pageId);
mTabHolderLeft.setSelectedPage(page);
} else {
Page page = findPage(mPageManagerRight.getPages(), pageId);
mTabHolderRight.setSelectedPage(page);
}
}
@Override
public List<Page> findPagesByRule(KindaLinqRule<Page> rule) {
return from(getAllPages()).where(rule).all();
}
@Override
public Page getSelectedPage() {
return mPageManagerRight.getSelectedPage() != null ? mPageManagerRight.getSelectedPage() : mPageManagerLeft.getSelectedPage();
}
@Override
public Page getSelectedContactList() {
return mPageManagerLeft.getSelectedPage();
}
@Override
public void removePage(Page page) {
if (mPageManagerRight.getPages().contains(page)) {
mPageAdapterRight.remove(page);
mPageManagerRight.onPageRemoved(page);
if (mPageAdapterRight.getCount() > 0) {
setSelectedPage(mPageManagerRight.getPages().get(0).getPageId());
}
} else {
mPageAdapterLeft.remove(page);
mPageManagerLeft.onPageRemoved(page);
if (mPageAdapterLeft.getCount() > 0) {
setSelectedPage(mPageManagerLeft.getPages().get(0).getPageId());
}
}
if (mPageAdapterLeft.getCount() + mPageAdapterRight.getCount() < 1) {
getActivity().exitApplication();
}
}
@Override
public void updateTabWidget(Page p) {
if (mPageManagerLeft.getPages().contains(p)) {
View tabWidget = mTabHolderLeft.findViewWithTag(p);
mPageAdapterLeft.fillWithImageAndTitle(tabWidget, p);
} else {
View tabWidget = mTabHolderRight.findViewWithTag(p);
mPageAdapterRight.fillWithImageAndTitle(tabWidget, p);
}
}
@SuppressWarnings("serial")
@Override
public List<Page> getAllPages() {
return new ArrayList<Page>(mPageAdapterLeft.getCount() + mPageAdapterRight.getCount()){
{
addAll(mPageManagerLeft.getPages());
addAll(mPageManagerRight.getPages());
}
};
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
Page leftSelectedPage = mPageManagerLeft.getSelectedPage();
Page rightSelectedPage = mPageManagerRight.getSelectedPage();
if (rightSelectedPage != null) {
rightSelectedPage.onCreateOptionsMenu(menu, menuInflater);
}
if (leftSelectedPage != null) {
leftSelectedPage.onCreateOptionsMenu(menu, menuInflater);
}
}
@Override
public void onPrepareOptionsMenu(Menu menu) {
Page leftSelectedPage = mPageManagerLeft.getSelectedPage();
Page rightSelectedPage = mPageManagerRight.getSelectedPage();
if (rightSelectedPage != null && rightSelectedPage.hasMenu()) {
rightSelectedPage.onPrepareOptionsMenu(menu);
}
if (leftSelectedPage != null) {
leftSelectedPage.onPrepareOptionsMenu(menu);
}
}
@Override
public void onOptionsItemSelected(MenuItem item) {
Page leftSelectedPage = mPageManagerLeft.getSelectedPage();
Page rightSelectedPage = mPageManagerRight.getSelectedPage();
if (rightSelectedPage != null) {
rightSelectedPage.onOptionsItemSelected(item);
}
if (leftSelectedPage != null) {
leftSelectedPage.onOptionsItemSelected(item);
}
}
@Override
public boolean onCurrentPageKeyDown(int i, KeyEvent event) {
Page leftSelectedPage = mPageManagerLeft.getSelectedPage();
Page rightSelectedPage = mPageManagerRight.getSelectedPage();
if (rightSelectedPage != null) {
return rightSelectedPage.onKeyDown(i, event);
}
if (leftSelectedPage != null) {
return leftSelectedPage.onKeyDown(i, event);
}
return false;
}
@Override
public void storeScreenSpecificData(Bundle bundle) {}
@Override
public void recoverScreenSpecificData(Bundle bundle) {}
private Page findPage(List<Page> pages, final String pageId) {
return from(pages).where(new KindaLinqRule<Page>() {
@Override
public boolean match(Page t) {
return t.getPageId().equals(pageId);
}
}).first();
}
@SuppressLint("NewApi")
private void setMenuButtonAvailability() {
mMenuButton.setVisibility(
Build.VERSION.SDK_INT <= 10 || (Build.VERSION.SDK_INT >= 14 && ViewConfiguration.get(getContext()).hasPermanentMenuKey()) ?
View.GONE :
View.VISIBLE);
}
}